NVIDIA Container Toolkit を使って Docker コンテナで GPU を使う
最終更新日 2019/10/19
使用OS ver Ubuntu18.04
version docker 19.03
Proxy なし
はじめに
GPU の基本的なサポートが Docker 本体側に取り込まれて (v19.03 以降)、GPU ベンダーはそのドライバを提供する形に
つまり、cudaやcudnnは不要になりました
driverとNVIDIA Container Toolkitを使います
なお、nvidia-docker2 は非推奨 (Deprecated) という扱い。
Can I use 2.0 and 1.0 side-by-side?
Yes, but packages nvidia-docker2 and nvidia-docker conflict. You need to install nvidia-container-runtime instead of
nvidia->docker2 and register the new runtime manually.
Secure Bootを停止する
BIOSでSecure Bootを無効化する
ASUSではSecure Boot keysを削除しないと無効化できない
"Install default Secure Boot keys" で元に戻せるので、keyを削除してしまおう
NVIDIA Graphics Driver をインストール
デバイスなどの確認
下記コマンドで接続されているグラフィックボードが認識されているか確認する
$ lspci | grep -i nvidia
ドライバ等確認
nvidia関係のドライバが入っていないか確認
$ dpkg -l | grep nvidia
何も表示されなければOK。何か入っていれば、下記コマンドで削除する
$ sudo apt --purge remove nvidia-*
$ sudo apt autoremove
NVIDIA グラフィックドライバーのPPAを登録し、情報の更新を行う。
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
必要なドライバーを確認する
$ ubuntu-drivers devices
code:result
vendor : NVIDIA Corporation
driver : nvidia-driver-390 - third-party free
driver : nvidia-driver-430 - third-party free
driver : nvidia-driver-435 - third-party free
driver : nvidia-driver-440 - third-party free recommended
driver : nvidia-driver-415 - third-party free
driver : nvidia-driver-410 - third-party free
driver : xserver-xorg-video-nouveau - distro free builtin
推奨されているドライバをインストール
$ sudo apt -y install nvidia-driver-440
再起動
$ reboot
GPUのサマリを表示
$ nvidia-smi
driverのバージョンが狙い通りならOK
NVIDIA Container Toolkit をインストール
リポジトリを APT に登録
OKと表示されるはず
$ sudo apt update
nvidia-container-toolkitをインストール
$ sudo apt -y install nvidia-container-toolkit
再起動
$ reboot
info確認
$ nvidia-container-cli info
下記が表示。CUDAのバージョンをしっっっかり確認しよう
code: result
NVRM version: 440.26
CUDA version: 10.2
Device Index: 0
Device Minor: 0
Model: GeForce GTX 1080
Brand: GeForce
GPU UUID: GPU-3e38511f-ef2e-1eb8-07d0-bce83a209d41
Bus Location: 00000000:01:00.0
Architecture: 6.1
Dockerに渡すファイルを確認
$ nvidia-container-cli list
ここはへ〜そうなんだくらいでいいかな
code: result
/dev/nvidiactl
/dev/nvidia-uvm
/dev/nvidia-uvm-tools
/dev/nvidia-modeset
/dev/nvidia0
/usr/bin/nvidia-smi
/usr/bin/nvidia-debugdump
/usr/bin/nvidia-persistenced
/usr/bin/nvidia-cuda-mps-control
/usr/bin/nvidia-cuda-mps-server
/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-cfg.so.440.26
/usr/lib/x86_64-linux-gnu/libcuda.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-fatbinaryloader.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-compiler.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-encode.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-opticalflow.so.440.26
/usr/lib/x86_64-linux-gnu/libnvcuvid.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-eglcore.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-tls.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-glsi.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-fbc.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-ifr.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-rtcore.so.440.26
/usr/lib/x86_64-linux-gnu/libnvoptix.so.440.26
/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.440.26
/usr/lib/x86_64-linux-gnu/libEGL_nvidia.so.440.26
/usr/lib/x86_64-linux-gnu/libGLESv2_nvidia.so.440.26
/usr/lib/x86_64-linux-gnu/libGLESv1_CM_nvidia.so.440.26
/usr/lib/x86_64-linux-gnu/libnvidia-glvkspirv.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-ml.so.440.26
/usr/lib/i386-linux-gnu/libcuda.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-opencl.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-ptxjitcompiler.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-fatbinaryloader.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-compiler.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-encode.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-opticalflow.so.440.26
/usr/lib/i386-linux-gnu/libnvcuvid.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-eglcore.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-glcore.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-tls.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-glsi.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-fbc.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-ifr.so.440.26
/usr/lib/i386-linux-gnu/libGLX_nvidia.so.440.26
/usr/lib/i386-linux-gnu/libEGL_nvidia.so.440.26
/usr/lib/i386-linux-gnu/libGLESv2_nvidia.so.440.26
/usr/lib/i386-linux-gnu/libGLESv1_CM_nvidia.so.440.26
/usr/lib/i386-linux-gnu/libnvidia-glvkspirv.so.440.26
/run/nvidia-persistenced/socket
Dockerで動かしてみる
試しにtensorflowの1.14.0イメージでnvidia-smiを見てみる
$ docker run --gpus all --rm -it tensorflow/tensorflow:1.14.0-gpu-py3-jupyter nvidia-smi
GPUを認識し、Hostと同じ情報が出るはず。
PyhonでGPUを確認
$ docker run --gpus all --rm -it tensorflow/tensorflow:1.14.0-gpu-py3-jupyter python
code: python
import tensorflow as tf
tf.test.gpu_device_name()
'/device:GPU:0'と出ればOK
参考